home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / os2 / pmnos11s / i8250.h < prev    next >
C/C++ Source or Header  |  1992-10-31  |  7KB  |  208 lines

  1. /* Various I/O definitions specific to asynch I/O on the IBM PC */
  2. /*
  3.  * mods by G1EMM
  4.  */
  5. #ifndef    _8250_H
  6. #define    _8250_H
  7.  
  8. #ifndef    _MBUF_H
  9. #include "mbuf.h"
  10. #endif
  11.  
  12. #ifndef _PROC_H
  13. #include "proc.h"
  14. #endif
  15.  
  16. #ifndef    _IFACE_H
  17. #include "iface.h"
  18. #endif
  19.  
  20. /* Output pseudo-dma control structure */
  21. struct dma {
  22.     char *data;    /* current output pointer */
  23.     unsigned short cnt;    /* byte count remaining */
  24.     char flags;    /* transmitter active */
  25. };
  26.  
  27. /* Read fifo control structure */
  28. struct fifo {
  29.     char *buf;        /* Ring buffer */
  30.     unsigned bufsize;    /* Size of ring buffer */
  31.     char *wp;        /* Write pointer */
  32.     char *rp;        /* Read pointer */
  33.     unsigned short cnt;    /* count of characters in buffer */
  34.     unsigned short hiwat;    /* High water mark */
  35.     long overrun;        /* count of sw fifo buffer overruns */
  36.     char chByte;        /* place to put rcvd char */
  37. };
  38.  
  39. /* Asynch controller control block */
  40. struct asy {
  41.     struct iface *iface;
  42.     struct fifo fifo;
  43.     int trigchar;        /* Fifo trigger character */
  44.  
  45.     struct dma dma;
  46.     struct mbuf *sndq;    /* Transmit queue */
  47.  
  48.     struct proc *monitor;
  49.  
  50.     unsigned addr;        /* Base I/O address */
  51.     unsigned vec;        /* Interrupt vector */
  52.     int32 speed;        /* Line speed in bits per second */
  53.  
  54.     struct {        /* Previous configuration saved at startup */
  55.         INTERRUPT (*vec) __ARGS((void));
  56.                 /* Original interrupt vector [cs:pc] */
  57.         char mask;    /* 8259 mask */
  58. #if defined(OS2)
  59.         ULONG ulBaud;    /* baud rate divisor */
  60.         LINECONTROL lcr;    /* line control reg */
  61.         DCBINFO dcb;    /* dcb info */
  62.         MODEMSTATUS msr;
  63. #endif
  64.         char divh,divl;    /* baud rate divisor */
  65. #if !defined(OS2)
  66.         char lcr;    /* line control reg */
  67. #endif
  68.         char ier;    /* Interrupt enable register */
  69.         char iir;       /* Interrupt ID reg, fifo type */
  70.         char mcr;    /* modem control bits */
  71. #if !defined(OS2)
  72.         char msr;    /* modem status bits */
  73. #endif
  74.         char dummy;
  75.     } save;
  76.  
  77.     char is_16550a;        /* 16550A detected */
  78.     char msr;
  79.  
  80. #define FOUND_DOWN    0x00
  81. #define FOUND_UP    0x01
  82. #define MOVED_DOWN    0x02
  83. #define MOVED_UP    0x03
  84. #define IGNORED     0x04
  85.         char dtr_usage;
  86.         char rts_usage;
  87.  
  88.     char cts_flow_control;
  89.     char rlsd_line_control;    /* RLSD indicates physical layer up/down */
  90.  
  91.     long fifotimeouts;    /* hw fifo character timeout int's */
  92.     long rxints;        /* receive interrupts */
  93.     long txints;        /* transmit interrupts */
  94.     long rxchar;        /* Received characters */
  95.     long overrun;        /* Receiver hardware overrun errors */
  96.     long txchar;        /* Transmitted characters */
  97.     long rxhiwat;        /* High water mark on hardware rx fifo */
  98.     long msint_count;    /* Count of modem status interrupts */
  99.     long txto;        /* Count of TX interrupt timeouts */
  100. };
  101.  
  102. extern int Nasy;        /* Actual number of asynch lines */
  103. extern struct asy Asy[];
  104. extern char *arg_dtr_0[];
  105.  
  106. #define    BAUDCLK    115200L        /* 1.8432 Mhz / 16 */
  107.  
  108. /* 8250 definitions */
  109. /* Control/status register offsets from base address */
  110. #define    THR    0        /* Transmitter holding register */
  111. #define    RBR    0        /* Receiver buffer register */
  112. #define    DLL    0        /* Divisor latch LSB */
  113. #define    DLM    1        /* Divisor latch MSB */
  114. #define    IER    1        /* Interrupt enable register */
  115. #define    IIR    2        /* Interrupt ident register */
  116. #define    FCR    2        /* FIFO control register (16550A only) */
  117. #define    LCR    3        /* Line control register */
  118. #define    MCR    4        /* Modem control register */
  119. #define    LSR    5        /* Line status register */
  120. #define    MSR    6        /* Modem status register */
  121.  
  122. /* 8250 Line Control Register */
  123. #define    LCR_5BITS    0x00    /* 5 bit words */
  124. #define    LCR_6BITS    0x01    /* 6 bit words */
  125. #define    LCR_7BITS    0x02    /* 7 bit words */
  126. #define    LCR_8BITS    0x03    /* 8 bit words */
  127. #define LCR_BIT_MASK    0x03    /* mask of bit size */
  128. #define    LCR_NSB        0x04    /* Number of stop bits */
  129. #define    LCR_PEN        0x08    /* Parity enable */
  130. #define    LCR_EPS        0x10    /* Even parity select */
  131. #define    LCR_SP        0x20    /* Stick parity */
  132. #define    LCR_SB        0x40    /* Set break */
  133. #define    LCR_DLAB    0x80    /* Divisor Latch Access Bit */
  134.  
  135. /* 8250 Line Status Register */
  136. #define    LSR_DR        0x01    /* Data ready */
  137. #define    LSR_OE        0x02    /* Overrun error */
  138. #define    LSR_PE        0x04    /* Parity error */
  139. #define    LSR_FE        0x08    /* Framing error */
  140. #define    LSR_BI        0x10    /* Break interrupt */
  141. #define LSR_THRE    0x20    /* Transmitter line holding register empty */
  142. #define LSR_TSRE    0x40    /* Transmitter shift register empty */
  143.  
  144. /* 8250 Interrupt Identification Register */
  145. #define    IIR_IP        0x01    /* 0 if interrupt pending */
  146.  
  147. #define    IIR_MSTAT    0x00    /* Modem status interrupt */
  148. #define    IIR_THRE    0x02    /* Transmitter holding register empty int */
  149. #define    IIR_RDA        0x04    /* Receiver data available interrupt */
  150. #define    IIR_RLS        0x06    /* Receiver Line Status interrupt */
  151. #define IIR_ID_MASK    0x06    /* Mask for interrupt ID */
  152.  
  153. #define IIR_FIFO_TIMEOUT 0x08    /* FIFO timeout interrupt pending - 16550A */
  154. #define IIR_FIFO_ENABLED 0xc0    /* FIFO enabled (FCR0,1 = 1) - 16550A only */
  155.  
  156.  
  157. /* 8250 interrupt enable register bits */
  158. #define    IER_DAV        0x01    /* Data available interrupt */
  159. #define    IER_TxE        0x02    /* Tx buffer empty interrupt */
  160. #define    IER_RLS        0x04    /* Receive line status interrupt */
  161. #define    IER_MS        0x08    /* Modem status interrupt */
  162.  
  163. /* 8250 Modem control register */
  164. #define    MCR_DTR        0x01    /* Data Terminal Ready */
  165. #define    MCR_RTS        0x02    /* Request to Send */
  166. #define    MCR_OUT1    0x04    /* Out 1 (not used) */
  167. #define    MCR_OUT2    0x08    /* Master interrupt enable (actually OUT 2) */
  168. #define    MCR_LOOP    0x10    /* Loopback test mode */
  169.  
  170. /* 8250 Modem Status Register */
  171. #define    MSR_DCTS    0x01    /* Delta Clear-to-Send */
  172. #define    MSR_DDSR    0x02    /* Delta Data Set Ready */
  173. #define    MSR_TERI    0x04    /* Trailing edge ring indicator */
  174. #define    MSR_DRLSD    0x08    /* Delta Rx Line Signal Detect */
  175. #define    MSR_CTS        0x10    /* Clear to send */
  176. #define    MSR_DSR        0x20    /* Data set ready */
  177. #define    MSR_RI        0x40    /* Ring indicator */
  178. #define MSR_RLSD    0x80    /* Rx line signal detect */
  179.  
  180. /* 16550A FIFO control register values */
  181. #define    FIFO_ENABLE    0x01    /* enable TX & RX fifo */
  182. #define    FIFO_CLR_RX    0x02    /* clear RX fifo */
  183. #define    FIFO_CLR_TX    0x04    /* clear TX fifo */
  184. #define    FIFO_START_DMA    0x08    /* enable TXRDY/RXRDY pin DMA handshake */
  185. #define FIFO_SIZE_1    0x00    /* RX fifo trigger levels */
  186. #define FIFO_SIZE_4    0x40
  187. #define FIFO_SIZE_8    0x80
  188. #define FIFO_SIZE_14    0xC0
  189. #define FIFO_SIZE_MASK    0xC0
  190.  
  191. /* it seems kevin g1emm was not to happy about fifo's in 15550's , so: */
  192.  
  193. #define FIFO_TRIGGER_LEVEL    FIFO_SIZE_1    /* was _4 */
  194. #define FIFO_SETUP    (FIFO_ENABLE|FIFO_CLR_RX|FIFO_CLR_TX|FIFO_TRIGGER_LEVEL)
  195.  
  196. #define OUTPUT_FIFO_SIZE    1        /* was 16 */
  197.  
  198. /* end g1emm mod */
  199.  
  200. /* In asyvec.asm: */
  201. INTERRUPT asy0vec __ARGS((void));
  202. INTERRUPT asy1vec __ARGS((void));
  203. INTERRUPT asy2vec __ARGS((void));
  204. INTERRUPT asy3vec __ARGS((void));
  205. INTERRUPT asy4vec __ARGS((void));
  206.  
  207. #endif    /* _8250_H */
  208.